package GUI;

import DAL.Conexao;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;

/**
 * Classe que fornece interface grafica das opções de menu do jogo.
 *
 * @author (R. Soares)
 * @version (1.0 - 04.05.2010)
 */
public class MenuGUI extends JFrame
{
    // Variáveis de Instância --------------------------------------------------*
    private String _nomeJogo =  null;
    private String _nomePartida = null;
    private ArrayList _listaNomeJogos;
    private int _opcao;
    private int _opcaoAnterior;
    private Conexao cx = new Conexao();

    private int op;

    // Configuração de dimenções da menu
    private static final int PREFERRED_WIDTH = 200;
    private static final int PREFERRED_HEIGHT = 180;
    private static final Dimension PREFERRED_SIZE =
                                new Dimension(PREFERRED_WIDTH,PREFERRED_HEIGHT);

    // Contrutores  ------------------------------------------------------------ *
    /**
     * Criação do frame para o panel.
     *
     * @param   int - opcaoAnterior : Opção anterior realizada no menu.
     * @param   ArrayList - listaNomeJogos : Lista de nomes de jogos salvos.
     */
    public MenuGUI(int opcaoAnterior, ArrayList listaNomeJogos)
    {
        JPanel jpanel = new JPanel();
        initComponents();

        // Recebe lista de jogos salvos para apresentação no menu.
        _listaNomeJogos = listaNomeJogos;

        // Inclui nome na janela de menu
       setTitle("2010 - Menu");

       // Caso o menu tenha sido aberto vindo de um jogo ativo, habilita que o fechamento
       // da janela, volte ao menu anterior.

       if(opcaoAnterior != 0)
       {
            addWindowListener(new WindowAdapter()
            {
                    public void windowClosing(WindowEvent ev)
                    {
                        setVisible(false);
                        _opcao = 8;
                    }
            });
        }

       // Caso o menu tenha sido aberto sem haver qualquer jogo ativo, habilita que o
       // fechamento da janela encerre o sistema.
        else
        {
             addWindowListener(new WindowAdapter()
            {
                    public void windowClosing(WindowEvent ev)
                    {
                        System.exit(0);
                    }
            });
        }

        // Cria um container para a área de botões e inclui a área de botões no container
        final Container contentPane = getContentPane();
        contentPane.add(menuBotoes(opcaoAnterior) );

        // Estabelece as dimensões da área de menu.
        setSize(PREFERRED_SIZE);

        // Desabilita a caracteristica de redimencionamento da tela.
        this.setResizable(false);

        // Posiciona a janela no centro da tela
        this.setLocationRelativeTo(null);

        // Inicializa a opção de menu como 0
        _opcao = 0;

        _opcaoAnterior = opcaoAnterior;
        
    }

    // Método ----------------------------------------------------------------- *
    
    
        
    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>                        
    // Variables declaration - do not modify                     
    // End of variables declaration                   


    /**
     * Abre a janela, se a mesma não estiver fechada.
     */
    public void showWindow()
    {
        setVisible(true);
    }

    /**
     * Configura o panel da área de botões. Retorna um container da área configurada.
     *
     * @param  int - OpcaoAnterior : Opção de menu previamente selecionada.
     * @return Container : Container da área de botões
     */
    private Container menuBotoes(int opcaoAnterior)
    {
        // Criação dos panels para inclusão dos botões.
        JPanel buttonArea1 = new JPanel();
        JPanel buttonArea2 = new JPanel();
        JPanel buttonArea3 = new JPanel();

        // Criação dos botões para inclusão dos botões.
        JButton novo =  new JButton(" Novo Jogador ");
        JButton abrir =   new JButton(" Abrir Jogo ");
        JButton salvar = new JButton("Salvar Jogo");
        JButton sair =    new JButton("   Sair   ");

        // Desabilitação de botões
        if (opcaoAnterior != 1 && opcaoAnterior != 2 && opcaoAnterior != 5 && opcaoAnterior != 8)
            salvar.setEnabled(false);

        if ( _listaNomeJogos == null)
            abrir.setEnabled(false);

        // Tomada de ação para acionamento do botão novo.
        novo.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ev)
            {
                    trataBotaoNovo();
            }
        });

        // Tomada de ação para acionamento do botão abrir.
        abrir.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev)
            {

                if (_opcaoAnterior != 1 && _opcaoAnterior != 2 && _opcaoAnterior != 4 &&
                                                                            _opcaoAnterior != 4 && _opcaoAnterior != 7)
                {
                         _opcao = 3;
                 }
                else
                         _opcao = 4;
            }
        });

        // Tomada de ação para acionamento do botão salvar.
        salvar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev)
            {
                trataBotaoSalvar();
            }
        });

        // Tomada de ação para acionamento do botão sair.
        sair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ev)
            {
               _opcao = 10;
            }
        });

        buttonArea1.add(novo, BorderLayout.SOUTH);
        buttonArea2.add(abrir, BorderLayout.CENTER);
        buttonArea2.add(salvar, BorderLayout.SOUTH);
        buttonArea3.add(sair, BorderLayout.CENTER);

        // Layout the details area above the button area.
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        panel.add(buttonArea1, BorderLayout.NORTH );
        panel.add(buttonArea2, BorderLayout.CENTER );
        panel.add(buttonArea3, BorderLayout.SOUTH );

        return panel;
    }

    /**
     * Realiza o tratamento do acionamento do botão "Novo Jogo"
     */
     private void trataBotaoNovo()
     {
         boolean existeJogo = true;
         boolean informouNome;
         int  opcaoNovoJogo= 0;

         while(existeJogo)
         {
                informouNome = false;

                while( ! informouNome)
                {
                    // Apresenta janela de entrada de dados de nome de jogo.
                    _nomeJogo = JOptionPane.showInputDialog("Digite o nome do jogador");

                    if ( _nomeJogo != null)
                    {
                            // Verifica se o usuário digitou um nome
                            if (  _nomeJogo.equals("") )
                            {
                                 JOptionPane.showMessageDialog(this, "Digite um nome para o jogo");
                             }

                             else
                             {
                                 informouNome = true;
                             }
                     }

                     else
                     {
                           informouNome = true;
                     }
              }

              if ( _nomeJogo != null)
              {
                    existeJogo = false;

                    // Verifica se o nome apresentado já existe
                    existeJogo = cx.existeJogador(_nomeJogo);

                    // Caso o nome já exista, informa e solicita decisão para novo jogo
                    if (existeJogo)
                    {
                            JOptionPane.showMessageDialog(this,
                                              "O jogo informado já existe. Apague antes de criar um novo");
                     }

                     else
                     {
                           if (_opcaoAnterior != 1 && _opcaoAnterior != 2 && _opcaoAnterior != 4 &&
                                                                            _opcaoAnterior != 4 && _opcaoAnterior != 7)
                           {
                               _opcao = 1;
                           }
                           else
                              _opcao = 2;
                     }
                }

                else
                {
                    existeJogo = false;
                }
           }
     }

    /**
     * Realiza o tratamento do acionamento da opção salvar jogo
     */
     private void trataBotaoSalvar()
     {
             JOptionPane.showMessageDialog(this, "Jogo Salvo");
             _opcao = 6;
     }


    /**
     * Retorna o nome do jogador.
     *
     * @return   String : Nome do jogador
     */
     public String getNome()
     {
        return _nomeJogo;
     }
     
     /*
      * Retorna o nome da partida.
      * 
      * @return String : Nome da partida
      */
     public String getNomePartida(){
         return _nomePartida;
     }


    /**
     * Retorna a opção selecionada no menu.
     *
     * @return   int : Opcao selecionada
     */
     public int getOpcao()
     {
        return _opcao;
     }


}
